package com.sky.context;

public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * 设置当前线程的唯一标识符。
     *
     * 本方法通过ThreadLocal为当前线程设置一个唯一的标识符。这个标识符可以被线程中的其他代码访问，
     * 用于标识当前操作的上下文。例如，在多线程环境下，每个线程可能需要有自己的数据副本，避免数据竞争，
     * 这时就可以使用ThreadLocal来存储每个线程的数据。
     *
     * @param id 当前线程的唯一标识符。这个参数被设置为ThreadLocal的值，从而可以被当前线程的其他代码访问。
     */
    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    /**
     * 获取当前线程的唯一标识符。
     *
     * 本方法通过ThreadLocal获取当前线程绑定的标识符。ThreadLocal为每个线程维护了一个独立的变量副本，
     * 从而确保了不同线程之间的变量隔离，这对于需要线程安全的场景非常有用。
     * 在本上下文中，当前线程的标识符被用作一个Long值，这个值在当前线程的生命周期内保持不变。
     *
     * @return 当前线程的唯一标识符，作为一个Long值返回。
     */
    public static Long getCurrentId() {
        return threadLocal.get();
    }

    /**
     * 移除当前线程绑定的ID。
     * <p>
     * 该方法用于清理线程局部变量ThreadLocal中的值。当不再需要某个线程特定的数据时，
     * 调用此方法可以避免内存泄漏。在线程生命周期结束之前，及时清理ThreadLocal变量是非常重要的，
     * 特别是当这些变量持有强引用时，否则可能会导致内存泄露。
     * </p>
     *
     * @see ThreadLocal
     */
    public static void removeCurrentId() {
        threadLocal.remove();
    }

}
